package com.hs.thread.$4;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.TimeUnit;

/**
 * TODO
 *
 * @author hushe
 * @date 2020/7/11/0011 16:38
 * @email husheng3921@163.com
 */
public class WaitNotify {
    static boolean flag = true;
    static Object lock = new Object();

    public static void main(String[] args) throws InterruptedException {
        Thread waitThread = new Thread(new Wait(), "WaitThread");
        waitThread.start();
        TimeUnit.SECONDS.sleep(1);
        Thread notfiyThread = new Thread(new Notify(), "NotifyThread");
        notfiyThread.start();
    }
    static class Wait implements Runnable{
        @Override
        public void run() {
            //加锁
            synchronized (lock){
                while (flag){
                    try {
                        System.out.println(Thread.currentThread() +" flag is true. wati @" + new SimpleDateFormat("HH:mm:ss").format(new Date()));
                        lock.wait();
                    }catch (InterruptedException e){

                    }
                }
                //满足条件时
                System.out.println(Thread.currentThread()+ "flag is false, running @"+ new SimpleDateFormat("HH:mm:ss").format(new Date()));
            }

        }
    }
    static class Notify implements Runnable{
        @Override
        public void run() {
            synchronized (lock){
                System.out.println(Thread.currentThread() + "hold lock.notify @"+ new SimpleDateFormat("HH:mm:ss").format(new Date()));
                lock.notifyAll();
                flag = false;
                SleepUtils.second(5);
            }
            synchronized (lock){
                System.out.println(Thread.currentThread() + "hold lock.again . sleep@"+ new SimpleDateFormat("HH:mm:ss").format(new Date()));
                SleepUtils.second(5);
            }
        }
    }
}
